iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Python

在AWS上進行物聯網與人工智慧實作系列 第 29

D29-實驗:查詢資料庫中的資料 - DynamoDB

  • 分享至 

  • xImage
  •  

實驗:查詢資料庫中的資料 - DynamoDB

目錄

使用 Python 查詢上一個實驗所儲存在 DynamoDB 內的資料,本實驗將提供這樣的整合練習:Python SDK + DynamoDB

啟動學習者實驗室

AWS Academy Learner Lab 是提供一個帳號讓學生可以自行使用 AWS 的服務,讓學生可以在 50 USD的金額下,自行練習所要使用的 AWS 服務,在此先介紹一下 Learner Lab 基本操作與限制。
AWS Academy 學習平台 的入口首頁 https://www.awsacademy.com/LMS_Login ,選擇以學生 (Students) 身分登錄,在課程選單中選擇 AWS Academy Learner Lab - Foundation Services 的課程,在課程選單中選擇 單元 (Module),接著單擊 啟動 AWS Academy Learner Lab,如下圖所示。

https://ithelp.ithome.com.tw/upload/images/20240905/20129510KKMRf2pRJ7.png
圖 1. 啟動 AWS Academy Learner Lab

進入 Learner Lab 中,說明一下每個區塊,圖形在下方。

  1. 用來啓動 AWS 管理控制台介面,必須是出現綠點才可以點擊,而出現綠點必須要先啓動實驗 (Start Lab)
  2. 已用金額與全部實驗金額 (Used $0.2 of $50)。
  3. 工具列說明:
    • 『Start Lab』:開始實驗帳號,這時候就可以使用 AWS 資源。
    • 『End Lab』:就會停止計費,並把所有的 AWS 資源關閉,注意,這只是暫停這些資源,並不會回收。
    • 『AWS Details』:使用者(IAM 用戶)相關的密鑰資料可以從來取得。
    • 『Readme』:說明手冊,就是下方的 5.
    • 『Reset』:就會把目前所有的 AWS 設定好的資源都清除掉。
  4. 切換說明的語系,ZH-CN 是簡體中文。
  5. 說明手冊。

https://ithelp.ithome.com.tw/upload/images/20240905/20129510E3EwfthEQQ.png
圖 2. Learner Lab 畫面說明

連接到 AWS Cloud9 IDE 並配置環境

AWS Cloud9 IDE 畫面與 VS Code 畫面相似,左手邊是功能視窗,可以檢視檔案與其他功能;,右上方是檔案編輯畫面,可以進行檔案編輯,撰寫程式進行 AWS SDK 操作;右下方則是終端命令列介面,可以輸入指令,進行 AWS CLI 操作。

https://ithelp.ithome.com.tw/upload/images/20240905/20129510aYTwhds9F9.png
圖 3. AWS Cloud9 IDE

在下方的終端輸入以下指令,取得實驗所需要的資源,可以在左上角看到已下載的檔案。

git clone https://github.com/yehchitsai/AIoTnAWSCloud

https://ithelp.ithome.com.tw/upload/images/20240905/20129510y8OcZONTmj.png
圖 4. 取得實驗所需要的資源

檢查 Cloud9 開發環境的套件版本

工具 版本
git 2.40.1 (git -v)
AWS CLI aws-cli/2.17.24 Python/3.11.9 Linux/6.1.102-108.177.amzn2023.x86_64 exe/x86_64.amzn.2023 (aws --version)
python 3.9.16 (python3 -V)
boto3 1.34.161 (pip list)
s3transfer 0.10.2
openpyxl 3.1.5
et-xmlfile 1.1.0
pandas 2.0.3
numpy 1.24.4
tzdata 2024.1
pytz 2024.1
python-dateutil 2.9.0.post0

利用主鍵查詢資料

打開 query_prinarykey.py 並執行,會得到一筆資料或是沒有,結果下圖。

https://ithelp.ithome.com.tw/upload/images/20240905/20129510aDCwvro6RK.png
圖 5. query_prinarykey.py 執行結果

# Returns a set of attributes for the item of DynamoDB table with the given primary key
import json
import boto3
import logging
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)
dyn_resource = boto3.resource("dynamodb")
table_name = 'students'
table = dyn_resource.Table(table_name)

result = table.get_item( 
    Key={'student_id': 's003'},
    ConsistentRead=True,
)

if result.get('Item'):
    print(result['Item'])
else:
    print('not found')

利用類似SQL語法查詢資料-PartiQL

打開 query_sql.py 並執行,會得到多筆資料(雖然只有一筆,但是以陣列方式呈現),結果下圖。

https://ithelp.ithome.com.tw/upload/images/20240905/20129510ScDs3WQxY1.png
圖 6. query_sql.py 執行結果

# Query a DynamoDB table by using PartiQL statements and an AWS SDK
import json
import boto3
import logging
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)
dyn_resource = boto3.resource("dynamodb")
table_name = 'students'
table = dyn_resource.Table(table_name)

def run_partiql(statement, param_list):
    try:
        output = dyn_resource.meta.client.execute_statement(
            Statement=statement, 
            Parameters=param_list
        )
    except ClientError as err:
        logger.error(
            "Couldn't execute batch of PartiQL statements. Here's why: %s: %s",
            err.response["Error"]["Code"],
            err.response["Error"]["Message"],
        )
        raise
    else:
        return output

sql = f'SELECT * FROM "{table_name}" WHERE city=? '
parameters = ['台中市']
results=run_partiql(sql,parameters)
print(results['Items'])

把整個資料表讀回查詢資料-scan

打開 query_scan.py 並執行,會得到多筆資料(雖然只有一筆,但是以陣列方式呈現),結果下圖。

https://ithelp.ithome.com.tw/upload/images/20240905/20129510B1sbnodvFE.png
圖 7. query_scan.py 執行結果

# Query a DynamoDB table by using PartiQL statements and an AWS SDK
import json
import boto3
import logging
from botocore.exceptions import ClientError

logger = logging.getLogger(__name__)
dyn_resource = boto3.resource("dynamodb")
table_name = 'students'
table = dyn_resource.Table(table_name)

results = table.scan(
    FilterExpression="#city = :v1",
    ExpressionAttributeNames={'#city': 'city'},
    ExpressionAttributeValues={
        ':v1': '台中市'
    }
)
if len(results['Items'])>0:
    print(results['Items'])
else:
    print('not found')

參考資料


上一篇
D28-實驗:讀取 EXCEL 檔並存入資料庫中 - DynamoDB
下一篇
D30-Amazon Rekognition
系列文
在AWS上進行物聯網與人工智慧實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言